var arr1 = [1, 2, 3, 4, 5, 4, 5];
var arr2 = [1, 2, 3, 4, 5, 4, 5, 6, 6];
// let r1 = arr1.reduce((acc, cur, index, arr) => { acc.includes(cur) ? acc : acc.push(cur); return acc }, [])//数组去重
// let r2 = arr2.filter((item, index, arr) => arr.indexOf(item) === index)//利用indexof返回的是第一个出现的元素下标特性。
// console.log(r1)
// console.log(r2)

// 1，斐波拉契数列0,1,1,2,3,5,8...根据下标求值，并且缓存结果
// 方式一，函数式编程
function fn(n){
  if(n===0){
    return 0
  }
  if(n===1){
    return 1
  }
  return fn(n-1)+fn(n-2)
}
// console.log(fn(6))
function memory(fn){//通用缓存函数
  let cache={}
  return function(){
    let key=JSON.stringify(arguments)
    cache[key] = cache[key] || fn.apply(this, arguments)
    console.log(cache)
    return cache[key] 
  }
}
console.log(memory(fn)(6))
memory(fn)(5)
// 方式二，面向对象
class cacheFibonacci {
  //es6可以定义静态方法，不能定义属性。es7才有静态属性，可以通过babel编译。
  // static getCache(){
  //   return {}
  // }
  static cache={} //等价于#cache={}。只能通过类本身访问。
  constructor(index){
    this.index=index
  }
  recurve(index){
    if (index=== 0) { return 0 }
    if (index === 1) { return 1 }
    return this.recurve(index - 1) + this.recurve(index - 2)
    console.log('调用了递归',)
  }
  memory(){
    return  cacheFibonacci.cache[this.index] = cacheFibonacci.cache[this.index] || this.recurve(this.index)
  }
}
console.log(new cacheFibonacci(6).memory())


// 'hello js world' => 'hello1 js2 world3'
//正则使用,\b单词边界
let str = 'hello js world ew'
function replace(str){
  console.log(str.match(/[a-z|A-Z]\b/g))
  // let r = str.replace(/$\b/g, '3').replace(/\s/i,'1 ')
  return r = str.replace(/[a-z|A-Z]\b/g,'1')
  // return r = str.replace(/[a-z|A-Z]\b/g,'1')
  // for (let i = 0; i <= str.match(/[a-z|A-Z]\b/g).length+1; i++){
  //  str = str.replace(/[a-z|A-Z]\b/i, i+1+' ')
  // }
  // return str
}
console.log(replace(str))


